// 定义和广告相关的接口
const express = require('express')
const fs = require('fs')
const path = require('path')
const router = express.Router()

// 引入广告的model对象
const advModel = require('../db/models/advModel')
const adminModel = require('../db/models/model')

// 引入tokenManger
const tokenManger = require('../utils/token')

// 定义一个中间件
async function vertifyToken(req, res, next) {
  // 从请求头中获取token
  const token = req.get('token')
  // 如果浏览器上传token就是一个有内容的字符串,如果没有上传就是undefined
  if (token) {
    // 说明上传token,要继续判断数据中的token和当前token是否一致
    // 如果找到了是当前登录用户的信息对象,如果找不到就是null
    const admin = await adminModel.findOne({ token })
    if (admin) {
      // 校验token的有效期
      // 解析token,拿到生成token的时间戳,和当前时间进行对比,如果超过30分钟,则认为登录超过,如果没有超过30分钟,则认为登录有效
      const result = tokenManger.decodeToken(token)
      // 半小时的毫秒值 1000 * 60 * 30
      const validTime = 1000 * 60 * 60 * 24
      if (Date.now() - result.expires < validTime) {
        // token有效
        next()
      } else {
        // token无效
        res.redirect('/login')
      }
    } else {
      // 说明token不一致
      res.redirect('/login')
    }
  } else {
    // 说明没有上传token
    res.redirect('/login')
  }
}

// 添加广告
router.post('/addAdv', vertifyToken, async function (req, res) {
  // 接收表单上传的数据
  const { advTitle, advCate, advLink } = req.fields
  const { file } = req.files
  // 根据上传的文件,截取文件的文件名
  const filename = file.path.split('\\')[2]
  // 拼接可以访问到这个文件的url地址
  // http://localhost:5001/uploadDir/图片的名称
  const advImg = `http://localhost:5001/uploadDir/${filename}`

  // 将这些广告信息,存储到广告的集合中
  await advModel.create({ advTitle, advCate, advLink, advImg })
  res.send({ status: 'ok', message: '广告添加成功' })
})

// 获取广告数据
router.get('/getAdvs', vertifyToken, async function (req, res) {
  const advs = await advModel.find()
  res.send(advs)
})

// 删除一条广告
router.post('/delAdv', vertifyToken, async function (req, res) {
  // 接收被删除数据的id
  const { id } = req.fields

  // 要删除指定广告所对应的文件
  // 删除文件,使用fs模块的方法 fs.unlinkSync(被删除文件的绝对路径)
  // 先通过id找到要删除的广告数据,就可以获取到advImg,advImg里面有要删除文件的文件名,利用文件名,就可以拼接出来,当前文件在服务器中的绝对路径
  // 获取广告数据
  const adv = await advModel.findOne({ _id: id })
  // 获取文件名
  const filename = adv.advImg.replace('http://localhost:5001/uploadDir/', '')
  // 根据文件名,拼接这个文件在服务器中的绝对路径
  const filePath = path.resolve(__dirname, '../public/uploadDir', filename)
  // console.log(filePath)

  // 删除服务器对应的文件(注意: 删除文件的代码写完之后,不要着急测试.等把删除数据库代码写完之后,一起测试)
  fs.unlinkSync(filePath)

  // 操作数据库,删除数据库里面的指定数据
  await advModel.deleteOne({ _id: id })
  res.send({ status: 'ok', message: '广告删除成功' })
})

// 修改广告的路由
router.post('/updateAdv', vertifyToken, async function (req, res) {
  // 接收数据
  const { advTitle, advCate, advLink, id } = req.fields
  const { file } = req.files
  // console.log(file) // 如果修改广告,没有修改图片.formdata中也有file字段.解构出来的file也是一个对象

  // console.log(id)

  // 如果修改逻辑中,上传了新的图片文件,就需要拼接新的url路径,如果没有上传文件,就不需要拼接新的url
  if (file.size) {
    // 删除原来的图片
    // 根据id获取要修改的广告数据
    const adv = await advModel.findOne({ _id: id })
    // 获取当前广告数据中图片的url地址,截取之前图片的文件名
    const oldfilename = adv.advImg.replace(
      'http://localhost:5001/uploadDir/',
      ''
    )
    // 拼接旧文件的绝对路径
    const filePath = path.resolve(__dirname, '../public/uploadDir', oldfilename)
    // 删除旧文件
    fs.unlinkSync(filePath)
    // 说明要修改文件
    // 根据上传的文件,截取文件的文件名
    const filename = file.path.split('\\')[2]
    // 拼接可以访问到这个文件的url地址
    // http://localhost:5001/uploadDir/图片的名称
    const advImg = `http://localhost:5001/uploadDir/${filename}`

    await advModel.updateOne(
      { _id: id },
      { $set: { advTitle, advCate, advLink, advImg } }
    )
  } else {

    
    // 说明不修改文件
    await advModel.updateOne(
      { _id: id },
      { $set: { advTitle, advCate, advLink } }
    )
  }
  res.send({ status: 'ok', message: '修改成功' })
})

// 返回一条广告数据接口
router.get('/getOneAdv', vertifyToken, async function (req, res) {
  // 注意: get请求,获取参数是req.query
  const { id } = req.query
  const adv = await advModel.findOne({ _id: id })
  res.send(adv)
})

module.exports = router
